NexusPi Git Node
Platform.h HEAD (592c826d) Text, 2.73 KB
T8b949e// Copyright (C) 2026, Chad Attermann
T8b949e//
T8b949e// Platform abstraction for cross-target builds. Provides:
T8b949e// - FreeRTOS xQueue-compatible shim on native Linux (std::deque + mutex)
T8b949e// - WDT / reboot wrappers that no-op on hosts without those primitives
T8b949e//
T8b949e// Existing ESP32/nRF52 code paths use FreeRTOS APIs directly; we re-implement
T8b949e// the small subset actually used (xQueueCreate / xQueueSendFromISR /
T8b949e// xQueueReceive / pdPASS / pdTRUE) for MCU_NATIVE so call sites don't need
T8b949e// per-platform forks.
Tff7b72#Tff7b72ifndef PLATFORM_H
Tff7b72#Tff7b72define PLATFORM_H
Tff7b72#Tff7b72include T8b949e"Boards.h"
Tff7b72#Tff7b72if MCU_VARIANT == MCU_NATIVE
Tff7b72#Tff7b72include T8b949e<cstddef>
Tff7b72#Tff7b72include T8b949e<cstdint>
Tff7b72#Tff7b72include T8b949e<cstdlib>
Tff7b72#Tff7b72include T8b949e<cstring>
Tff7b72#Tff7b72include T8b949e<deque>
Tff7b72#Tff7b72include T8b949e<mutex>
Tff7b72#Tff7b72include T8b949e<condition_variable>
Te6edf3namespace Te6edf3mr_platform Tb4b4b4{
T8b949e// Fixed-size, single-producer / single-consumer queue of byte blobs.
T8b949e// The xQueue API stores by value; we mirror that by memcpy'ing item_size
T8b949e// bytes per push/pop. In practice the firmware enqueues pointers
T8b949e// (sizeof(modem_packet_t*) == 8), so each "item" is a pointer-sized blob.
Te6edf3class Te6edf3Queue Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3QueueTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Tffa657size_t Te6edf3capacityTb4b4b4, Te6edf3stdTff7b72:Tff7b72:Tffa657size_t Te6edf3item_sizeTb4b4b4)
Tff7b72: Te6edf3capacity_Tb4b4b4(Te6edf3capacityTb4b4b4)Tb4b4b4, Te6edf3item_size_Tb4b4b4(Te6edf3item_sizeTb4b4b4) Tb4b4b4{Tb4b4b4}
Tffa657bool Te6edf3sendTb4b4b4(Tff7b72const Tffa657voidTff7b72* Te6edf3itemTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lkTb4b4b4(Te6edf3m_Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3q_Tb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3capacity_Tb4b4b4) Tff7b72return Tffa657falseTb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72> Te6edf3blobTb4b4b4(Te6edf3item_size_Tb4b4b4)Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3memcpyTb4b4b4(Te6edf3blobTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3itemTb4b4b4, Te6edf3item_size_Tb4b4b4)Tb4b4b4;
Te6edf3q_Tb4b4b4.Te6edf3push_backTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3moveTb4b4b4(Te6edf3blobTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3cv_Tb4b4b4.Te6edf3notify_oneTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3recvTb4b4b4(Tffa657voidTff7b72* Te6edf3itemTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3lock_guardTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mutexTff7b72> Te6edf3lkTb4b4b4(Te6edf3m_Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3q_Tb4b4b4.Te6edf3emptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return Tffa657falseTb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3memcpyTb4b4b4(Te6edf3itemTb4b4b4, Te6edf3q_Tb4b4b4.Te6edf3frontTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3item_size_Tb4b4b4)Tb4b4b4;
Te6edf3q_Tb4b4b4.Te6edf3pop_frontTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Te6edf3privateTff7b72:
Te6edf3stdTff7b72:Tff7b72:Tffa657size_t Te6edf3capacity_Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Tffa657size_t Te6edf3item_size_Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3dequeTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Tffa657uint8_tTff7b72>Tff7b72> Te6edf3q_Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3mutex Te6edf3m_Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3condition_variable Te6edf3cv_Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Tb4b4b4} T8b949e// namespace mr_platform
Te6edf3using Te6edf3xQueueHandle Tff7b72= Te6edf3mr_platformTff7b72:Tff7b72:Te6edf3QueueTff7b72*Tb4b4b4;
Tff7b72inline Te6edf3xQueueHandle Td2a8ffxQueueCreateTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Tffa657size_t Te6edf3countTb4b4b4, Te6edf3stdTff7b72:Tff7b72:Tffa657size_t Te6edf3item_sizeTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3new Te6edf3mr_platformTff7b72:Tff7b72:Te6edf3QueueTb4b4b4(Te6edf3countTb4b4b4, Te6edf3item_sizeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72define pdPASS 1
Tff7b72#Tff7b72define pdTRUE 1
Tff7b72#Tff7b72define pdFALSE 0
Tff7b72inline Tffa657int Td2a8ffxQueueSendFromISRTb4b4b4(Te6edf3xQueueHandle Te6edf3qTb4b4b4, Tff7b72const Tffa657voidTff7b72* Te6edf3itemTb4b4b4, Tffa657voidTff7b72* T8b949e/*unused*/Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(Te6edf3q Tff7b72&Tff7b72& Te6edf3qTff7b72-Tff7b72>Te6edf3sendTb4b4b4(Te6edf3itemTb4b4b4)Tb4b4b4) Tff7b72? Te6edf3pdPASS Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72inline Tffa657int Td2a8ffxQueueReceiveTb4b4b4(Te6edf3xQueueHandle Te6edf3qTb4b4b4, Tffa657voidTff7b72* Te6edf3itemTb4b4b4, Tffa657uint32_t T8b949e/*ticks*/Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(Te6edf3q Tff7b72&Tff7b72& Te6edf3qTff7b72-Tff7b72>Te6edf3recvTb4b4b4(Te6edf3itemTb4b4b4)Tb4b4b4) Tff7b72? Te6edf3pdTRUE Tff7b72: Te6edf3pdFALSETb4b4b4;
Tb4b4b4}
T8b949e// Watchdog & critical-section shims: native has no FreeRTOS scheduler
T8b949e// and systemd Restart=on-failure provides equivalent supervision.
Tff7b72inline Tffa657void Td2a8ffesp_task_wdt_resetTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
Tff7b72#Tff7b72define portENTER_CRITICAL() do { } while (0)
Tff7b72#Tff7b72define portEXIT_CRITICAL() do { } while (0)
Tff7b72#Tff7b72endif T8b949e// MCU_VARIANT == MCU_NATIVE
Tff7b72#Tff7b72endif T8b949e// PLATFORM_H
Served by rngit 1.5.4 - Generated in 0.02s